#ifndef PROJECT_H
#define PROJECT_H

#include <iostream>
#include <fstream>
#include <vector>
#include <QString>
#include <map>
#include <queue>
#include <sstream>
#include <QTextBrowser>
#include <QEventLoop>

using namespace std;
class Form2_1;
class Form2_2;
class Form2_2_1;
class Form2_4;
class Form1_1;
class Form2_5;
class Form3_1;
class Form2_4_2;
class Form3_2;
class Widget;

// 客户信息
struct Passenger {
    string name;
    int cabinClass; // 1, 2, or 3
};

// 航线信息
struct Flight {
    string destination;
    string flightNumber;
    string airplaneNumber;
    int dayOfWeek;
    int capacity;
    int remainingTickets;
    vector<Passenger> bookedPassengers;
    queue<Passenger> waitingList;
};

class FlightBookingSystem {
private:
    vector<Flight> flights;
    string flight_filename; //存储航班的数据文件路径
    string passenger_filename; //存储乘客信息的文件路径
    string candidatepassenger_filename; //存储候补乘客的文件路径

    // 从文件加载航班信息
    void loadFlightsFromFile(const string& filename);

    // 修改文件中的航班信息
    void modifyFlightInfo(const string& flightNumber,const string& airphoneNumber, const Flight& newFlightInfo);


    // 从文件加载航班乘客信息
    void loadPassengersFromFile(const string& filename);

    // 更新航班乘客信息到文件
    void updatePassengersToFile(const string& filename);

    // 从文件加载候补乘客信息
    void loadCandidatePassengersFromFile(const string& filename);

    // 更新航班候补乘客信息到文件
    void updateCandidatePassengersToFile(const string& filename);

public:

    Widget *last=nullptr;
    Form2_1 *page2_1=nullptr;
    Form2_2 *page2_2=nullptr;
    Form2_2_1 *page2_2_1=nullptr;
    Form2_4 *page2_4=nullptr;
    Form1_1 *page1_1=nullptr;
    Form2_5 *page2_5=nullptr;
    Form3_1 *page3_1=nullptr;
    Form2_4_2 *page2_4_2=nullptr;
    Form3_2 *page3_2=nullptr;

    FlightBookingSystem(const string& filename1 , const string& filename2 , const string& filename3);

    // 查询航班信息
    void queryFlight(const string& destination , QTextBrowser *qtb);

    // 订票
    void bookTicket(const string& flightNumber , int quantity);


    // 退票
    void cancelTicket(const string& flightNumber, const string& passengerName);

    // 修改航班信息的公共接口
    void modifyFlight(const string& flightNumber, const string& airphoneNumber, Flight& newFlightInfo);

    // 显示航班信息
    void displayFlights(QTextBrowser *qtb);

    //判断能否修改航线数据
    bool ismodifyFlights(const string& flightNumber,const string& airphoneNumber);

    //通过航班号找到对应航班的指针
    Flight* findFlightByNumber(const string& flightNumber);
};


#endif // PROJECT_H
